package org.javahispano.javacup.tacticas_aceptadas.shepryus;

import java.util.LinkedList;
import java.util.List;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

public class TacticaTecHk implements Tactica {

	private TacticaTecHkDetalle tacticaTecHkDetalle = new TacticaTecHkDetalle();
	private LinkedList<Comando> comandos = new LinkedList<Comando>();
	private boolean alto = false;
	private boolean enPase = false;
	private double fuerza = 0.7d;
	
	private final Posicion PAREARIVALIZQ;
	private final Posicion PAREARIVALDER;
	private final Posicion PAREALOCALIZQ;
	private final Posicion PAREALOCALDER;
	
	private final int AREA_ARCO_VISITANTE = 1;
	private final int AREA_CAMPO_VISITANTE = 2;
	private final int AREA_ARCO_LOCAL = 3;
	private final int AREA_CAMPO_LOCAL = 4;
	private final int CENTRO_CAMPO = 5;
	
	private int jugadorEspera = -1;
	
	private final Posicion alineacion352[]=new Posicion[]{
		new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-17.594405594405593,-19.2420814479638),
        new Posicion(-0.951048951048951,-26.131221719457013),
        new Posicion(14.74125874125874,-18.766968325791854),
        new Posicion(-20.447552447552447,3.088235294117647),
        new Posicion(-1.6643356643356644,-5.9389140271493215),
        new Posicion(17.832167832167833,3.800904977375566),
        new Posicion(-13.552447552447552,21.855203619909503),
        new Posicion(9.748251748251748,21.380090497737555),
        new Posicion(-8.321678321678322,35.39592760180996),
        new Posicion(8.083916083916083,35.39592760180996)
    };
	
	private final Posicion alineacionSaque[]=new Posicion[]{
		new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-18.545454545454543,-28.744343891402718),
        new Posicion(-0.23776223776223776,-33.257918552036195),
        new Posicion(16.167832167832167,-27.794117647058822),
        new Posicion(-23.3006993006993,-12.352941176470589),
        new Posicion(-2.377622377622378,-16.628959276018097),
        new Posicion(18.06993006993007,-10.690045248868778),
        new Posicion(-11.65034965034965,-4.98868778280543),
        new Posicion(10.6993006993007,-0.47511312217194573),
        new Posicion(-7.846153846153847,-0.23755656108597287),
        new Posicion(0.4755244755244755,0.0)
    };
	/*private final Posicion alineacionDefensa[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-25.916083916083913,-23.28054298642534),
        new Posicion(-10.223776223776223,-31.83257918552036),
        new Posicion(6.895104895104895,-32.07013574660634),
        new Posicion(22.349650349650346,-23.28054298642534),
        new Posicion(-0.951048951048951,-13.540723981900454),
        new Posicion(-24.48951048951049,0.7126696832579186),
        new Posicion(20.447552447552447,2.8506787330316743),
        new Posicion(-14.274809160305344,30.559701492537314),
        new Posicion(-0.7786259541984732,8.097014925373134),
        new Posicion(12.717557251908397,29.51492537313433)
    };*/
	
	Posicion recibe[]=new Posicion[]{
		new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-18.545454545454543,-28.744343891402718),
        new Posicion(-0.23776223776223776,-33.257918552036195),
        new Posicion(16.167832167832167,-27.794117647058822),
        new Posicion(-21.16083916083916,-9.027149321266968),
        new Posicion(-2.13986013986014,-20.192307692307693),
        new Posicion(18.545454545454543,-6.176470588235294),
        new Posicion(-9.034965034965035,-6.176470588235294),
        new Posicion(4.041958041958042,-9.027149321266968),
        new Posicion(-9.510489510489512,0.0),
        new Posicion(9.748251748251748,-0.7126696832579186)
    };
	Posicion retraer[]=new Posicion[]{
		new Posicion(0.2595419847328244,-50.41044776119403),
	    new Posicion(-18.545454545454543,-32.30769230769231),
	    new Posicion(0.23776223776223776,-35.15837104072398),
	    new Posicion(16.405594405594407,-32.782805429864254),
	    new Posicion(-24.251748251748253,-17.104072398190045),
	    new Posicion(-2.377622377622378,-19.2420814479638),
	    new Posicion(20.447552447552447,-14.490950226244346),
	    new Posicion(-17.11888111888112,-1.1877828054298643),
	    new Posicion(11.174825174825173,3.088235294117647),
	    new Posicion(-14.97902097902098,18.29185520361991),
	    new Posicion(6.419580419580419,20.667420814479637)
	};
	
	public TacticaTecHk () {
		double yAreaLargo = Constantes.centroArcoSup.getY() - ( ( Constantes.LARGO_AREA_GRANDE / 2 ) - 2 );
		double xAreaDer = Constantes.centroArcoSup.getX() + ( Constantes.ANCHO_AREA_GRANDE  );
		double xAreaIzq = Constantes.centroArcoSup.getX() - ( Constantes.ANCHO_AREA_GRANDE  );
		PAREARIVALIZQ = new Posicion ( xAreaIzq, yAreaLargo );
		PAREARIVALDER = new Posicion ( xAreaDer, yAreaLargo );
		yAreaLargo = Constantes.centroArcoInf.getY() + ( ( Constantes.LARGO_AREA_GRANDE / 2 ) - 2 );
		xAreaDer = Constantes.centroArcoInf.getX() + ( Constantes.ANCHO_AREA_GRANDE  );
		xAreaIzq = Constantes.centroArcoInf.getX() - ( Constantes.ANCHO_AREA_GRANDE  );
		
		PAREALOCALIZQ = new Posicion ( xAreaIzq, yAreaLargo );
		PAREALOCALDER = new Posicion ( xAreaDer, yAreaLargo );
	}
	
	public List<Comando> ejecutar( SituacionPartido sp ) {
		if ( !enPase ) {
			comandos.clear();
		}
		double distanciaApoyo = 999999999;
		double distanciaRival = -1;
		double disArco;
		double alturaBalon;
		int jugadoresCercanos [] = null;
		int balonEnJuego;
		int jugadorCerca = 0;
		int jugadorCercaRival = -1;
		int arquero = 0;
		int jugadorMasCercano = -1;
		int indMasCercanosApoyo [];
		int indMasCercanosRemate [];
		arquero = buscarArquero( sp.detalleMisJugadores() );
		int [] excluirArquero = {arquero};
		jugadorCercaRival = jugadorCercano( sp.balon(), sp.rivales(), null );
		jugadoresCercanos = jugadoresCercanos( sp.balon(), sp.misJugadores() );
		indMasCercanosApoyo = jugadoresCercanos( sp.balon(), sp.misJugadores() );
		indMasCercanosRemate = sp.puedenRematar();
		disArco = distanciaDosPuntos( sp.balon(), Constantes.centroArcoSup );
		alturaBalon = sp.alturaBalon();
		if ( alturaBalon == 0.0 ) {
			enPase = false;
			jugadorEspera = -1;
		}
		if ( !sp.saco() ) {
			if ( !sp.sacaRival() ) {
				balonEnJuego = ubicarEnArea( sp.balon() );
				switch ( balonEnJuego ) {
					case AREA_ARCO_VISITANTE: {
						ubicarEnformacion( FORMACION_OFENSIVA );
						jugadorMasCercano = jugadorCercano( sp.balon(), sp.misJugadores(), null );
						moverJugador( jugadorMasCercano, sp.balon() );
						for ( int i = 0; i < indMasCercanosApoyo.length && i < 4; i++ ) {
							if ( indMasCercanosApoyo[ i ] != jugadorMasCercano ) {
								int aleatorio = ( int ) (Math.random() * 2) + 1;
								Posicion ubicacion;
								if ( aleatorio == 1 ) {
									ubicacion = new Posicion ( Constantes.penalSup.getX() - (i * 2), Constantes.penalSup.getY() );
								} else {
									ubicacion = new Posicion ( Constantes.penalSup.getX() + (i * 2), Constantes.penalSup.getY() );
								}
								moverJugador( indMasCercanosApoyo[ i ], ubicacion );
							}
						}
						tiroArco(sp, jugadorMasCercano, disArco);
						break;
					}
					case AREA_CAMPO_VISITANTE: {
						if ( !enPase ) {
							ubicarEnformacion( FORMACION_OFENSIVA );
						}
						jugadorMasCercano = jugadorCercano( sp.balon(), sp.misJugadores(), null );
						disArco = distanciaDosPuntos( sp.misJugadores() [ jugadorMasCercano ], Constantes.centroArcoSup );
						for ( int i = 0; i < indMasCercanosApoyo.length && i < 2; i++ ) {
							if ( indMasCercanosApoyo[ i ] != jugadorEspera ) {
								moverJugador( indMasCercanosApoyo[ i ], sp.balon() );
							}
						}
						moverJugador( jugadorMasCercano, sp.balon() );
						if ( disArco < 36 ) {
							tiroArco(sp, jugadorMasCercano, disArco);
						} else {
							if ( !enPase ) {
								ponerPase( sp, jugadorMasCercano );
							}
						}
						break;
					}
					case AREA_CAMPO_LOCAL: {
						ubicarEnformacion( FORMACION_DEFENSIVA );
						jugadorMasCercano = jugadorCercano( sp.balon(), sp.misJugadores(), excluirArquero );
						comandos.add( new ComandoIrA ( jugadorMasCercano, sp.balon() ) );
						boolean continuar = true;
						int jugador = -1;
						int segundo = 0;
						double distanciaJugadores = 0;
						double fuerza = 0.7d;
						double angulo = 6;
						sale:
							for ( int i = 0; i < indMasCercanosRemate.length; i++ ) {
								if ( indMasCercanosRemate[ i ] != jugadorMasCercano ) {
									jugador = indMasCercanosRemate[ i ];
									if ( sp.misJugadores() [ jugador ].getY() > sp.misJugadores() [ jugadorMasCercano ].getY() ) {
										if ( segundo < 1 ) {
											segundo++;
										} else {
											continuar = false;
											break sale;
										}
									}
								}
							}
						if ( !continuar ) {
							distanciaJugadores = distanciaDosPuntos( sp.misJugadores() [ jugador ], sp.misJugadores() [ jugadorMasCercano ] );
							if ( sp.misJugadores() [ jugador ].getY() > Constantes.centroCampoJuego.getY() ) {
								fuerza = 1d;
								angulo = 18;
							} else if ( distanciaJugadores < 10 ) {
								fuerza = 0.7d;
							} else if ( distanciaJugadores > 9 && distanciaJugadores < 26 ) {
								fuerza = 0.8d;
							} else if ( distanciaJugadores >= 26 ) {
								fuerza = 0.9d;
							}
							if ( distanciaDosPuntos( sp.misJugadores() [ jugadorMasCercano ], sp.balon()) < Constantes.DISTANCIA_CONTROL_BALON ) {
								comandos.add( new ComandoGolpearBalon ( jugadorMasCercano, sp.misJugadores() [ jugador ], fuerza, angulo ) );
							}
							moverJugador(jugador, sp.balon() );
						} else {
							comandos.add( new ComandoGolpearBalon ( jugadorMasCercano, Constantes.penalSup, 1d, 30) );
						}
						int cantidad = 1;
						for ( int i = 0; i < indMasCercanosApoyo.length && i < cantidad; i++ ) {
							if ( indMasCercanosApoyo[ i ] != jugadorMasCercano && arquero != indMasCercanosApoyo[ i ] ) {
								Posicion ubicacion = new Posicion ( sp.balon().getX(), ( sp.balon().getY() - 2.5) );
								moverJugador( indMasCercanosApoyo[ i ], ubicacion );
							} else {
								cantidad++;
							}
						}
						break;
					}
					case AREA_ARCO_LOCAL: {
						ubicarEnformacion( FORMACION_DEFENSIVA );
						jugadorMasCercano = jugadorCercano( sp.balon(), sp.misJugadores(), null );
						for ( int i = 0; i < indMasCercanosApoyo.length && i < 4; i++ ) {
							if ( indMasCercanosApoyo[ i ] != jugadorMasCercano && arquero != indMasCercanosApoyo[ i ] ) {
								Posicion ubicacion;
								ubicacion = new Posicion ( ( Constantes.penalInf.getX() + 3 ) - (i * 3), ( Constantes.penalInf.getY() - 3 ) );
								moverJugador( indMasCercanosApoyo[ i ], ubicacion );
							}
						}
						moverJugador( jugadorMasCercano, sp.balon() );
						Posicion posDisparo;
						Posicion reubicarArquero;
						if ( sp.balon().getY() < ( Constantes.penalInf.getY() - 4 ) ) {
							moverJugador( arquero, sp.balon() );
						} else {
							if ( sp.balon().getX() > 2 ) {
								double suma = sp.misJugadores() [ arquero ].getX();
								if ( suma < 1.3 ) {
									suma += 1.3;
								}
								if ( suma == 0 ) {
									suma += 1.3;
								}
								reubicarArquero = new Posicion ( suma, Constantes.centroArcoInf.getY() + 2 );
							} else if ( sp.balon().getX() < -2 ) {
								double resta = sp.misJugadores() [ arquero ].getX();
								if ( resta > -1.3 ) {
									resta -= 1.3;
								}
								if ( resta == 0 ) {
									resta -= 1.3;
								}
								reubicarArquero = new Posicion ( resta, Constantes.centroArcoInf.getY() + 2 );
							} else {
								reubicarArquero = new Posicion ( Constantes.centroArcoInf.getX(), Constantes.centroArcoInf.getY() + 2 );
							}
							moverJugador( arquero, reubicarArquero );
						}
						if ( sp.rivales() [ jugadorCercaRival ].getX() > 0 ) {
							posDisparo = new Posicion ( Constantes.cornerInfIzq.getX(), Constantes.centroCampoJuego.getY() );
						} else {
							posDisparo = new Posicion ( Constantes.cornerInfDer.getX(), Constantes.centroCampoJuego.getY() );
						}
						comandos.add( new ComandoGolpearBalon ( jugadorMasCercano, posDisparo, 1d, 30) );
						break;
					}
					case CENTRO_CAMPO: {
						jugadorMasCercano = jugadorCercano( sp.balon(), sp.misJugadores(), null );
						ubicarEnformacion( FORMACION_OFENSIVA );
						moverJugador( jugadorMasCercano, sp.balon() );
						comandos.add( new ComandoGolpearBalon ( jugadorMasCercano, sp.misJugadores() [ 0 ], 0.6, false ) );
						break;
					}
				}
			}
		} else {
			jugadorMasCercano = jugadorCercano( sp.balon(), sp.misJugadores(), null );
			if ( arquero != jugadorMasCercano ) {
				moverJugador( jugadorMasCercano, sp.balon() );
				//jugadoresCercanos = jugadoresCercanos( sp.misJugadores()[ jugadorMasCercano ], sp.misJugadores() );
				for ( int i = 0; i < jugadoresCercanos.length; i++) {
        			if ( jugadoresCercanos[ i ] != jugadorMasCercano ) {
        			double distanciaApoyoTemp = sp.misJugadores()[ jugadorMasCercano ].distancia( sp.misJugadores()[ jugadoresCercanos[ i ] ] );
	        			if ( distanciaApoyoTemp < distanciaApoyo ) {
	        				distanciaApoyo = distanciaApoyoTemp;
	        				jugadorCerca = jugadoresCercanos[ i ];
	        				if ( distanciaApoyo > 30 ) {
	            				alto = true;
	            				fuerza = 0.96d;
	            			} else if ( distanciaApoyo < 10 ) {
	            				fuerza = 0.6d;
	            			}
	        			}
        			}
        		}
				comandos.add( new ComandoGolpearBalon( jugadorMasCercano, sp.misJugadores()[ jugadorCerca ], fuerza, alto ) );
				comandos.add( new ComandoIrA( jugadorCerca, sp.balon() ) );
			} else {
				distanciaRival = sp.misJugadores()[ jugadorMasCercano ].distancia( sp.rivales()[ jugadorCercaRival ] );
				comandos.add( new ComandoIrA ( jugadorMasCercano, sp.balon() ) );
				if ( distanciaRival >= ( Constantes.DISTANCIA_SAQUE - 8) ) {
					comandos.add( new ComandoGolpearBalon( jugadorMasCercano, Constantes.centroArcoSup, 1d, true ) );
				}
			}
		}
		
		return comandos;
	}
	
	private void moverJugador ( int jugador, Posicion posFinal  ) {
		comandos.add( new ComandoIrA ( jugador, posFinal ) );
	}
	
	private final int FORMACION_OFENSIVA = 1;
	private final int FORMACION_DEFENSIVA = 2;
	
	private void ubicarEnformacion ( int tipoFormacion ) {
		switch ( tipoFormacion ) {
			case FORMACION_OFENSIVA: {
				for ( int i = 0; i < 11; i++ ) {
	        		comandos.add(new ComandoIrA(i, alineacion352[i]));
	        	}
				break;
			}
			case FORMACION_DEFENSIVA: {
				for ( int i = 0; i < 11; i++ ) {
	        		comandos.add(new ComandoIrA(i, retraer[i]));
	        	}
				break;
			}
		}
	}
	
	private int ubicarEnArea ( Posicion posBase ) {
		if ( posBase.getX() < puntoAreaRivalDer().getX() && posBase.getX() > puntoAreaRivalIzq().getX() && posBase.getY() > puntoAreaRivalDer().getY() ) {
			//area visitante arco
			return AREA_ARCO_VISITANTE;
		} else if ( posBase.getX() < puntoAreaLocalDer().getX() && posBase.getX() > puntoAreaLocalIzq().getX() && posBase.getY() < puntoAreaLocalDer().getY() ) {
			//area local arco
			return AREA_ARCO_LOCAL;
		} else {
			double distanciaVisitante;
			double distanciaLocal;
			distanciaVisitante = distanciaDosPuntos( Constantes.centroArcoSup, posBase );
			distanciaLocal = distanciaDosPuntos( Constantes.centroArcoInf, posBase );
			if ( distanciaVisitante > distanciaLocal ) {
				//balon en area local general
				return AREA_CAMPO_LOCAL;
			} else if ( distanciaVisitante < distanciaLocal ) {
				//balon en area visitante general
				return AREA_CAMPO_VISITANTE;
			} else {
				//posible centro del campo
				return CENTRO_CAMPO;
			}
		}
	}
	
	private int buscarArquero ( JugadorDetalle jugadoresDetalle [] ) {
		int arquero = -1;
		for ( int i = 0; i < jugadoresDetalle.length; i++ ) {
			JugadorDetalle jugador = jugadoresDetalle [ i ];
			if ( jugador.esPortero() ) {
				arquero = i;
				return arquero;
			}
		}
		return arquero;
	}
	
	private void tiroArco ( SituacionPartido sp, int jugador, double disArco ) {
		int arqueroRival = buscarArquero( sp.detalleJugadoresRivales() );
		double disIzq = distanciaDosPuntos( sp.rivales()[ arqueroRival ], Constantes.cornerSupIzq );
		double disDer = distanciaDosPuntos( sp.rivales()[ arqueroRival ], Constantes.cornerSupDer );
		double angulo = 4;
		if ( disArco > 20 ) {
			angulo = 20;
		} else {
			angulo = 16;
		}
		if ( disIzq < disDer ) {
			comandos.add( new ComandoGolpearBalon ( jugador, new Posicion ( Constantes.centroArcoSup.getX() + 1.4, Constantes.centroArcoSup.getY() ), 1d, angulo ) );
		} else if ( disIzq > disDer ) {
			comandos.add( new ComandoGolpearBalon ( jugador, new Posicion ( Constantes.centroArcoSup.getX() - 1.4, Constantes.centroArcoSup.getY() ), 1d, angulo ) );
		} else if ( disIzq == disDer ) {
			disIzq = distanciaDosPuntos( sp.misJugadores()[ jugador ], Constantes.cornerSupIzq );
			disDer = distanciaDosPuntos( sp.misJugadores()[ jugador ], Constantes.cornerSupDer );
			if ( disIzq < disDer ) {
				comandos.add( new ComandoGolpearBalon ( jugador, new Posicion ( Constantes.centroArcoSup.getX() - 1.4, Constantes.centroArcoSup.getY() ), 1d, angulo ) );
			} else if ( disIzq > disDer ) {
				comandos.add( new ComandoGolpearBalon ( jugador, new Posicion ( Constantes.centroArcoSup.getX() + 1.4, Constantes.centroArcoSup.getY() ), 1d, angulo ) );
			}
		} else {
			comandos.add( new ComandoGolpearBalon ( jugador, Constantes.centroArcoSup, 1d, angulo ) );
		}
	}
	
	private void ponerPase ( SituacionPartido sp, int jugador ) {
		Posicion posJugador = sp.misJugadores()[ jugador ];
		double disIzq = distanciaDosPuntos( posJugador, Constantes.cornerSupIzq );
		double disDer = distanciaDosPuntos( posJugador, Constantes.cornerSupDer );
		double distanciaJugadores;
		double fuerza = 0.7d;
		double angulo = 6;
		int judaorTemp;
		if ( disIzq < disDer ) {
			judaorTemp = PAREARIVALIZQ.indiceMasCercano( sp.misJugadores() );
			distanciaJugadores = distanciaDosPuntos( sp.misJugadores() [ jugador ], sp.misJugadores() [ judaorTemp ] );
			if ( distanciaJugadores < 10 ) {
				fuerza = 0.7d;
			} else if ( distanciaJugadores > 9 && distanciaJugadores < 26 ) {
				fuerza = 0.8d;
				angulo = 20;
			} else if ( distanciaJugadores >= 26 ) {
				fuerza = 0.9d;
				angulo = 28;
			}
			comandos.add( new ComandoIrA ( judaorTemp, PAREARIVALIZQ ) );
			comandos.add( new ComandoGolpearBalon ( jugador, PAREARIVALIZQ, fuerza, angulo ) );
		} else if ( disIzq > disDer ) {
			judaorTemp = PAREARIVALDER.indiceMasCercano( sp.misJugadores() );
			distanciaJugadores = distanciaDosPuntos( sp.misJugadores() [ jugador ], sp.misJugadores() [ judaorTemp ] );
			if ( distanciaJugadores < 10 ) {
				fuerza = 0.7d;
			} else if ( distanciaJugadores > 9 && distanciaJugadores < 26 ) {
				fuerza = 0.8d;
				angulo = 20;
			} else if ( distanciaJugadores >= 26 ) {
				fuerza = 0.9d;
				angulo = 28;
			}
			comandos.add( new ComandoIrA ( judaorTemp, PAREARIVALDER ) );
			comandos.add( new ComandoGolpearBalon ( jugador, PAREARIVALDER, fuerza, angulo ) );
		} else {
			judaorTemp = PAREARIVALDER.indiceMasCercano( sp.misJugadores() );
			distanciaJugadores = distanciaDosPuntos( sp.misJugadores() [ jugador ], sp.misJugadores() [ judaorTemp ] );
			if ( distanciaJugadores < 10 ) {
				fuerza = 0.7d;
			} else if ( distanciaJugadores > 9 && distanciaJugadores < 26 ) {
				fuerza = 0.8d;
				angulo = 20;
			} else if ( distanciaJugadores >= 26 ) {
				fuerza = 0.9d;
				angulo = 28;
			}
			comandos.add( new ComandoIrA ( judaorTemp, PAREARIVALDER ) );
			comandos.add( new ComandoGolpearBalon ( jugador, PAREARIVALDER, fuerza, 30 ) );
		}
		if ( !enPase ) {
			enPase = true;
			jugadorEspera = judaorTemp;
			//activarPase();
		}
	}
	
	private int [] jugadoresCercanos ( Posicion posBase, Posicion posJugadores [] ) {
		return posBase.indicesMasCercanos( posJugadores );
	}
	
	private int jugadorCercano ( Posicion posBase, Posicion posJugadores[], int [] excluir ) {
		if ( excluir != null ) {
			return posBase.indiceMasCercano( posJugadores, excluir );
		} else {
			return posBase.indiceMasCercano( posJugadores );
		}
	}
	
	private double distanciaDosPuntos ( Posicion posPuntoBase, Posicion posPuntoCompara ) {
		return posPuntoBase.distancia( posPuntoCompara );
	}
	
	public TacticaDetalle getDetalle() {
		return tacticaTecHkDetalle;
	}

	public Posicion[] getPosicionRecive(SituacionPartido sp) {
		return recibe;
	}

	public Posicion[] getPosicionSaca(SituacionPartido sp) {
		return alineacionSaque;
	}

	private Posicion puntoAreaRivalIzq() {
		return PAREARIVALIZQ;
	}

	private Posicion puntoAreaRivalDer() {
		return PAREARIVALDER;
	}

	private Posicion puntoAreaLocalIzq() {
		return PAREALOCALIZQ;
	}

	private Posicion puntoAreaLocalDer() {
		return PAREALOCALDER;
	}

}
